// var foo = {
//     value: 1
// };

// function bar() {
//     console.log(this.value);
// }

// bar.call(foo); // 1
// ================================= 上面bar.call可以用下面的代码近似理解
// var foo = {
//     value: 1,
//     bar: function() {
//         console.log(this.value)
//     }
// };

// foo.bar(); // 1




// 下面是模拟
Function.prototype.call2 = function (context) {
    var context = context || window; // 这个是传进来的对象,也就是你想要绑定的对象
    context.fn = this;// 这个是调用call2的方法.

    var args = [];
    for(var i = 1, len = arguments.length; i < len; i++) {
        args.push(arguments[i]);
        // args.push('arguments[' + i + ']');
    }
    // 这里的args得到的是参数
// =================================

    // var result = eval('context.fn(' + args +')');
    var result = context.fn(...args);

    // delete context.fn // 这里没删是为了看后面的
    return result;
}

// 测试一下
global.value = 2;

var obj = {
    value: 1
}

function bar(name, age) {
    console.log(this.value);
    return {
        value: this.value,
        name: name,
        age: age
    }
}

bar.call(null); // 2

console.log(bar.call2(obj, 'kevin', 18));
// 1
// Object {
//    value: 1,
//    name: 'kevin',
//    age: 18
// }
console.log(obj) //{ value: 1, fn: [Function: bar] }
